/**
 * 
 */
package model.persistence.mysql;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.GregorianCalendar;

import model.core.torneo.Gara;
import model.core.torneo.Torneo;
import model.core.utente.Giocatore;
import model.core.utente.GiocatoreInterface;
import model.core.utente.Squadra;

/**
 * @author Giuseppe Fusco (fusgius19@gmail.com)
 *
 */
public class MySQLTorneiQueryUtility {

	public static int getIdTorneoByNome(String nome, MySQLDBMS mys){
		try {
			ResultSet r = mys.getResult("select idtorneo from torneo where nome=\""+nome+"\"");
			if(r.first()){
				return r.getInt(1);
			}else
				return -1;
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			return -1;
		}
	}

	public static Torneo getTorneoById(int id, MySQLDBMS mys){
		try {
			ResultSet r = mys.getResult("select * from torneo where idtorneo="+id);
			if(r.first()){
				Torneo t = new Torneo(r.getInt("max_partecipanti"), r.getInt("min_partecipanti"));
				t.setNome(r.getString("nome"));
				t.setTipologia(r.getString("tipologia"));
				t.setStato(r.getString("stato_torneo"));
				t.setNumero_edizione(r.getInt("numero_edizione"));
				t.setAnno_svolgimento(r.getInt("anno_svolgimento"));
				t.setSingolo(r.getInt("is_singolo")==1?true:false);
				t.setVincitore(MySQLUtentiQueryUtility.getGiocatoreByIdGiocatore(r.getInt("vincitore"), mys));
				return t;
			}else
				return null;
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			return null;
		}
	}

	public static Torneo getTorneoByNome(String nome, MySQLDBMS mys){
		return getTorneoById(getIdTorneoByNome(nome, mys), mys);
	}

	public static int getIdGara(String nomeTorneo, MySQLDBMS mys){
		try {
			ResultSet r = mys.getResult("select idgara from gara where torneo=\""+getIdTorneoByNome(nomeTorneo, mys)+"\"");
			if(r.first())
				return r.getInt(1);
			else
				return -1;
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			return -1;
		}
	}
	
	public static Gara getGaraByNomeTorneo(String nomeTorneo, MySQLDBMS mys){
		return getGaraById(getIdGara(nomeTorneo, mys), mys);
	}

	public static Gara getGaraById(int id, MySQLDBMS mys){
		try {
			ResultSet r = mys.getResult("select * from gara where idgara="+id);
			if(r.first()){
				Gara g = new Gara();
				g.setNro_giorni_da_disputare(r.getInt("nro_giorni_da_disputare"));
				g.setStato(r.getString("stato_gara"));
				g.setSync(r.getInt("is_sync")==1?true:false);
				g.setVincitore(MySQLUtentiQueryUtility.getGiocatoreByIdGiocatore(r.getInt("vincitore"), mys));
				g.setArbitro(MySQLUtentiQueryUtility.getStudenteByIdStudente(r.getInt("arbitro"), mys));
				GregorianCalendar di = new GregorianCalendar();
				di.setTime(r.getDate("data_inizio"));
				g.setData_inizio(di);
				GregorianCalendar df = new GregorianCalendar();
				df.setTimeInMillis(r.getDate("data_fine").getTime());
				g.setData_fine(df);
				di=null;
				df=null;
				g.setGiocatori(getPartecipantiToGara(id, mys));
				return g;
			}else
				return null;
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			return null;
		}
		
	}
	
	public static boolean insertPartecipanteTorneo(GiocatoreInterface giocatore, Torneo torneo, MySQLDBMS mys){
		if(giocatore instanceof Giocatore)
			return insertGiocatore((Giocatore) giocatore, torneo, mys);
		else if(giocatore instanceof Squadra)
			return insertSquadra((Squadra) giocatore, torneo, mys);
		else
			return false;
	}
	
	private static boolean insertGiocatore(Giocatore s, Torneo torneo, MySQLDBMS mys){
		try {
				int n = MySQLUtentiQueryUtility.getIdStudente(s.getMatricola(), s.getPassword(), mys);
				if(n!=-1){
					PreparedStatement r = mys.getPreparedStatement("insert into giocatore(torneo,partite_giocate,partite_vinte,partite_perse,totale_punti, tipo, idstudente) values(?,?,?,?,?,?,?)");
						r.setInt(1, MySQLTorneiQueryUtility.getIdTorneoByNome(torneo.getNome(), mys));
						r.setInt(2, s.getPartite_giocate());
						r.setInt(3, s.getPartite_vinte());
						r.setInt(4, s.getPartite_perse());
						r.setInt(5, s.getTotale_punti());
						r.setString(6, "SINGOLO");
						r.setInt(7, n);
						r.execute();
						r.close();
						return true;
				}else
					return false;
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return false;
		}
	}
	
	private static boolean insertSquadra(Squadra s, Torneo torneo, MySQLDBMS mys){
		try {
				int pres = MySQLUtentiQueryUtility.getIdStudente(s.getPresidente().getMatricola(), s.getPresidente().getPassword(), mys);
				int c = MySQLUtentiQueryUtility.getIdStudente(s.getCapitano().getMatricola(), s.getCapitano().getPassword(), mys);
				PreparedStatement r = mys.getPreparedStatement("insert into giocatore(torneo,partite_giocate,partite_vinte,partite_perse,totale_punti, tipo,capitano,presidente,recapito,nome) values(?,?,?,?,?,?,?,?,?,?)");
				r.setInt(1, MySQLTorneiQueryUtility.getIdTorneoByNome(torneo.getNome(), mys));
				r.setInt(2, s.getPartite_giocate());
				r.setInt(3, s.getPartite_vinte());
				r.setInt(4, s.getPartite_perse());
				r.setInt(5, s.getTotale_punti());
				r.setString(6, "SQUADRA");
				if(c!=-1)r.setInt(7, c);
				else r.setNull(7, java.sql.Types.NULL);
				if(pres!=-1)r.setInt(8, pres);
				else r.setNull(8, java.sql.Types.NULL);
				r.setString(9, s.getPresidente().getRecapito());
				r.setString(10, s.getNome());
				r.execute();
				r.close();
				int sq = MySQLUtentiQueryUtility.getIdSquadraByNome(s.getNome(), mys);
				if(sq!=-1){
					for(Giocatore g: s.getPartecipanti()){
						int gid = MySQLUtentiQueryUtility.getIdStudente(g.getMatricola(), g.getPassword(), mys);
						mys.executeUpdate("insert into componenti_squadra(idsquadra,idgiocatore,partite_giocate,partite_vinte,partite_perse,totale_punti) values("+sq+","+gid+","+g.getPartite_giocate()+","+g.getPartite_vinte()+","+g.getPartite_perse()+","+g.getTotale_punti()+")");
					}
					return true;
				}
				else
					return false;
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
			return false;
		}
	}

	public static ArrayList<GiocatoreInterface> getPartecipantiToGara(int idgara, MySQLDBMS mys){
		ArrayList<GiocatoreInterface> g = new ArrayList<GiocatoreInterface>();
		try {
			ResultSet r = mys.getResult("select * from partecipanti_gara where gara="+idgara);
			while(r.next()){
				g.add(MySQLUtentiQueryUtility.getGiocatoreByIdGiocatore(r.getInt("giocatore"), mys));
			}
			return g;
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			return g;
		}
	}

	
}
